package kr.co.bettersoft.waitnumberstorem.activity;

import org.json.JSONException;
import org.json.JSONObject;

import kr.co.bettersoft.waitnumberstorem.activity.R;
import kr.co.bettersoft.waitnumberstorem.activity.CertificationStoreMStep2.RunnableCertificationStep_1;
import kr.co.bettersoft.waitnumberstorem.activity.CertificationStoreMStep2.RunnableCertificationStep_2;
import kr.co.bettersoft.waitnumberstorem.activity.CertificationStoreMStep2.backgroundThreadCertificationStep_1;
import kr.co.bettersoft.waitnumberstorem.common.CommonConstant;
import kr.co.bettersoft.waitnumberstorem.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstorem.domain.WaitingNumberStore;
import kr.co.bettersoft.waitnumberstorem.fragment.FragmentHome;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
 * LoginActivity
 * 
 * 로그인 액티비티
 * 
 * 가맹점 등록한 사용자는 등록한 아이디와 패스워드를 사용하여 로그인 할 수 있다.
 * 로그인 이후 순번어플의 기능을 이용할 수 있다.
 */
public class LoginActivity extends Activity{
/////////////////////////////////////////////////////////////////////////////////////////////////////
// 변수
	
	String TAG = "LoginActivity";

	public final int LOGIN = 201;									// 로그인한다
	public final int SELECT_MERCHANT_INFORMATION = 202;				// 가맹점 정보를 가져 온다. 	selectMerchantInformation

	
	// 로그인용 아이디, 비번 값
	String merchantId = "";
	String password = "";
	
	// 저장용
	String merchantName = "";
	String merchantBossName = "";
	
	SharedPreferences sharedPrefCustom;	// 공용 프립스	

//	MainTabsActivity mainTabs = (MainTabsActivity)MainTabsActivity.mainTabs;
	FragmentHome fragmentHome = (FragmentHome)FragmentHome.fragmentHome;
	
	// 서버 통신 용
	Boolean loading = false;
	WaitnumberStoreMRest waitnumberStoreMRest;
	String callResult = "";
	
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	// 화면 구성 					 
	Button loginBtn;		//	 로그인버튼
	Button registerBtn;		// 회원 가입
	TextView idText, pwText;		//아이디/비번입력창
	CheckBox checkAutoLogin; // 자동 로그인 체크	login_auto_login_check
	ProgressBar pb1;		// 중단 로딩 진행바
	
	// 자동 로그인 관련
	Boolean autoLoginChecked = false;
	String autoLoginId = "";
	String autoLoginPw = "";
	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기. 띄우는 문구는 msg 로 받은 값
					Toast.makeText(LoginActivity.this, b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("initLogin")==1){		// 화면 로그인 정보 초기화 하기
					idText.setText("");
					pwText.setText("");
				}
				if(b.getInt("loginEnable")==1){		// 화면 로그인 버튼 사용 가능
					loginBtn.setEnabled(true);
				}else if(b.getInt("loginEnable")==2){		// 화면 로그인 버튼 사용 불가
					loginBtn.setEnabled(false);
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.login_page_progressbar1);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				
				switch (msg.what)
				{
					case LOGIN : runOnUiThread(new RunnableLogin());					
						break;
					case SELECT_MERCHANT_INFORMATION : runOnUiThread(new RunnableSelectMerchantInformation());					
					break;
					default : 
						break;
				}
				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.login_activity);
		Log.w(TAG,"LoginActivity onCreate");
		
		waitnumberStoreMRest = new WaitnumberStoreMRest();
		
		// 프립
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);

		// 레이아웃의 개체들을 가져와서 사용
		loginBtn = (Button) findViewById(R.id.login_btn);
		registerBtn = (Button) findViewById(R.id.register_btn);
		idText = (TextView) findViewById(R.id.login_id_text);
		pwText = (TextView) findViewById(R.id.login_pw_text);
		checkAutoLogin = (CheckBox) findViewById(R.id.login_auto_login_check);	// 자동 로그인 체크
		
		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout = findViewById(R.id.login_page_parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				hideKeyboard();
			}
		});
		// 버튼  리스너.
		loginBtn.setOnClickListener(new OnClickListener() {			// 로그인 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"loginBtn click");
				loginDisable();
				merchantId = idText.getText()+"";	 
				handler.sendEmptyMessage(LOGIN);	
			}
		});
		// 버튼  리스너.
		registerBtn.setOnClickListener(new OnClickListener() {			// 가입 버튼
			@Override
			public void onClick(View v) {
				Log.w(TAG,"registerBtn click");
				Intent webIntent = new Intent(LoginActivity.this, MyWebViewActivity.class);
				webIntent.putExtra("loadingURL", CommonConstant.merchantRegisterURL);
				startActivity(webIntent);
//				loginDisable();
				
//				merchantId = idText.getText()+"";	 
//				handler.sendEmptyMessage(LOGIN);	
			}
		});
		
		if(checkAutoLoginYn()){
			idText.setText(autoLoginId);
			pwText.setText(autoLoginPw);
			loginDisable();
			handler.sendEmptyMessage(LOGIN);		
		}
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

	public void goMainTabs(){
		if(CommonConstant.comeBack){				// 이미 실행중이라 로그인 이후 그냥 죽을지
			CommonConstant.comeBack = false;
			finish();
		}else{									// 처음 실행이라 정상 로그인 진행할지
			checkTheCheckBox();		//  자동로그인
			//아이디 저장하고 가기.
			SharedPreferences.Editor saveMerchantIdToPref = sharedPrefCustom.edit();
			saveMerchantIdToPref.putString("merchantId", merchantId);			// 로그인한 가맹점 아이디 저장   
			saveMerchantIdToPref.putString("autoLoginId", merchantId);			// 로그인한 가맹점 비번   
			saveMerchantIdToPref.putString("autoLoginPw", password);			// 로그인한 가맹점 비번   
			saveMerchantIdToPref.putString("merchantName", merchantName);			// 로그인한 가맹점 비번   
			saveMerchantIdToPref.putString("merchantBossName",merchantBossName);			// 로그인한 가맹점 비번   
			saveMerchantIdToPref.commit();
			
//			Intent i = new Intent(this, MainTabsActivity.class);	// @@
			Intent i = new Intent(this, FragmentHome.class);		// @@ 
			startActivity(i);
			finish();
		}
	}
	
	/**
	 * pref 에서 자동 로그인 설정 정보를 가져온다.
	 * @return
	 */
	public Boolean checkAutoLoginYn(){
		autoLoginChecked = sharedPrefCustom.getBoolean("autoLoginChecked", false);
		autoLoginId = sharedPrefCustom.getString("autoLoginId", "");
		autoLoginPw = sharedPrefCustom.getString("autoLoginPw", "");
		return autoLoginChecked;
	}

	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	
	
	/**
	 * 러너블. 로그인한다
	 */
	class RunnableLogin implements Runnable {
		public void run(){
			new backgroundThreadLogin().execute();	
		}
	}
	/**
	 * backgroundThreadLogin
	 * 비동기  .  로그인한다
	 * @author blue
	 *
	 */
	public class backgroundThreadLogin extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadLogin");
			merchantId = idText.getText()+"";
			password = pwText.getText()+"";
			if(merchantId.length()<1){
				// 아이디 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_id));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
				loginEnable();
			}else if(password.length()<1){
				// 비번 미입력
				showResultDialog(returnThis().getResources().getString(R.string.input_your_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				loginEnable();
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
				waitingNumberStore.setMerchantId(merchantId);
				waitingNumberStore.setPassword(password);
				
				// 서버 통신
				hideKeyboard();
				showPb();
				callResult = waitnumberStoreMRest.RestLogin(waitingNumberStore);
//				hidePb();
				// 결과 처리	
				if(callResult.equals("0")){	// 에러 처리로 "0" 값 부여하므로 모든 실패에 대해 "0" 값이 됨
					// 로그인 실패
					hidePb();
					showResultDialog(returnThis().getResources().getString(R.string.login_failed));			// 로그인에 실패하였습니다.\n아이디,비밀번호를 다시 확인해주시기 바랍니다.	
					loading = false;
					initLogin();		// 화면의 아이디, 비번 입력창 초기화 
					loginEnable();
				}else{	
					// 로그인 성공
					if(CommonConstant.comeBack){		// 1. 홈으로 나갔다온경우. 
						hidePb();
						Log.d(TAG,"CommonUtils.comeBack T");
						if((CommonConstant.tempMyID).equals(merchantId)){					// 동일 아디일 경우 혼자 종료
							Log.d(TAG,"tempMyID  equals merchantId");
							CommonConstant.comeBack = false;
							finish();
						}else{
							Log.d(TAG,"tempMyID not equals merchantId");
						}
					}else{			
						// 2. 일반 로그인인 경우
						handler.sendEmptyMessage(SELECT_MERCHANT_INFORMATION);	// 메인탭 가기전에 가맹점 정보를 획득한다
//						goMainTabs();
					}
				}
			}
			return null; 
		}
	}
	/**
	 * 러너블. 가맹점 정보를 가져 온다.
	 */
	class RunnableSelectMerchantInformation implements Runnable {
		public void run(){
			new backgroundThreadSelectMerchantInformation().execute();	
		}
	}
	/**
	 * backgroundThreadSelectMerchantInformation
	 * 비동기  .  가맹점 정보를 가져 온다.
	 * @author blue
	 *
	 */
	public class backgroundThreadSelectMerchantInformation extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSelectMerchantInformation");
			
		
			// 파라미터 세팅
			WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
			waitingNumberStore.setMerchantId(merchantId);
			
			// 서버 통신
			hideKeyboard();
//			showPb();
			callResult = waitnumberStoreMRest.RestSelectMerchantInformation(waitingNumberStore);
			
			
			
			hidePb();
			// 결과 처리	
			if(!(callResult.equals("F"))){
					try {
						JSONObject jsonObject = new JSONObject(callResult);
						try{
							waitingNumberStore.setBossName(jsonObject.getString("name"));
						}catch(Exception e){
							waitingNumberStore.setBossName("");
						}
						try{
							waitingNumberStore.setCompanyName(jsonObject.getString("companyName"));
						}catch(Exception e){
							waitingNumberStore.setCompanyName("");
//							callResult = "F";
						}
					} catch (JSONException e) {
						
					}
				merchantName = waitingNumberStore.getCompanyName();
				merchantBossName = waitingNumberStore.getBossName();
				goMainTabs();		// 메인탭
			}else{	
				showResultDialog(returnThis().getResources().getString(R.string.login_failed));			// 로그인에 실패하였습니다.\n아이디,비밀번호를 다시 확인해주시기 바랍니다.	
				loading = false;
				initLogin();		// 화면의 아이디, 비번 입력창 초기화 
				loginEnable();
			}
			
			return null; 
		}
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 유틸	

	// 키보드를 숨긴다.
	public void hideKeyboard(){
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
		imm .hideSoftInputFromWindow(idText.getWindowToken(), 0);
	}
	
	// 체크박스가 체크되어있는지 확인 한다.
	public void checkTheCheckBox(){
		if(checkAutoLogin.isChecked()){
			SharedPreferences.Editor saveAutoLoginYn = sharedPrefCustom.edit();		// 공용에 저장 
			saveAutoLoginYn.putBoolean("autoLoginChecked", true);
			saveAutoLoginYn.putString("autoLoginId", merchantId);	 
			saveAutoLoginYn.putString("autoLoginPw", password);	
			saveAutoLoginYn.commit();
		}
	}
	
	/**
	 * returnThis
	 *  컨택스트 반환한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public Context returnThis(){
		return this;
	}
	
	
	/*
	 * 핸들러 파트.
	 *  화면상의 변화가 있는 요청은 핸들러를 사용
	 */
	/**
	 * showMsg
	 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showMsg(final String msg){		
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showToast", 1);
				b.putString("msg", msg);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * showResultDialog
	 *   얼럿 띄운다 
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * initLogin
	 * 아이디, 비번 초기화.  로그인 성공 또는 실패 이후 화면에 있던 로그인 정보를 초기화 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void initLogin(){			
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("initLogin", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * loginEnable
	 * 로그인 버튼 사용 가능 하게 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void loginEnable(){		
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("loginEnable", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * loginDisable
	 * 로그인 버튼 사용 불가로 만든다 (두번 눌리는것 방지)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void loginDisable(){		
		LoginActivity.this.runOnUiThread(new Runnable(){	 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("loginEnable", 2);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	
	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		LoginActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		LoginActivity.this.runOnUiThread(new Runnable(){	 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	
	/**
	 * onBackPressed
	 *  종료시 모두 종료시킨다. (홈갔다왔을때 용도)
	 *
	 * @param
	 * @param
	 * @return
	 */
	@Override
	public void onBackPressed() {
		if(CommonConstant.comeBack){
			CommonConstant.comeBack = false;
//			mainTabs.finish();			
			fragmentHome.finish();			
			finish();
		}
		super.onBackPressed();
	}
}
